const START_BTN_TEXT = "Следить";
const STOP_BTN_TEXT = "Перестать следить";
const SOUND_ON_TEXT_BTN = "Выкл. звук";
const SOUND_OFF_TEXT_BTN = "Вкл. звук";
const DURATION = 0.2; // minute
let soundON = true;
const soundFile =
  "https://cdn-prd.sounds.com/sounds/434165816e5346504436a979428f5cabcd7e619a_browser.mp4";

const defaultStopWords = ["заработай", "курьер", "битрикс", "1с"];
const defaultKeywords = [
  "python",
  "javascript",
  "js",
  "react",
  "nodejs",
  "telegram",
  "sql",
  "vk",
  "redux",
  "бот",
  "парс",
  "телеграм",
];

if (!localStorage.getItem("keywords")) {
  localStorage.setItem("keywords", defaultKeywords);
}
if (!localStorage.getItem("stopwords")) {
  localStorage.setItem("stopwords", defaultStopWords);
}

function getWords() {
  const keywords = localStorage.getItem("keywords");
  const stopWords = localStorage.getItem("stopwords");
  return [
    keywords ? keywords.split(",") : [],
    stopWords ? stopWords.split(",") : [],
  ];
}

const titleBlock = document.querySelector(".order-list-title");
const filterBlock = document.querySelector(".order-list-section-header");

const startBtn = document.createElement("button");
startBtn.classList.add("wz-button", "filter-button");
startBtn.innerText = START_BTN_TEXT;
startBtn.style.marginLeft = "0.5em";
filterBlock.appendChild(startBtn);

const settingsBtn = document.createElement("button");
settingsBtn.classList.add("wz-button", "filter-button");
settingsBtn.innerText = "Параметры слежения";
settingsBtn.style.marginLeft = "0.5em";
filterBlock.appendChild(settingsBtn);

const setSoundBtn = document.createElement("button");
setSoundBtn.classList.add("wz-button", "filter-button");
setSoundBtn.innerText = soundON ? SOUND_ON_TEXT_BTN : SOUND_OFF_TEXT_BTN;
setSoundBtn.style.backgroundColor = soundON ? "red" : "";
setSoundBtn.style.marginLeft = "0.5em";
filterBlock.appendChild(setSoundBtn);

function setup() {
  let [keywords, stopWords] = getWords();
  keywords = prompt(
    "Введите через пробел или отредактируйте ключевые слова для поиска заданий",
    keywords.join(" ")
  );
  stopWords = prompt(
    "Введите через пробел или отредактируйте стоп слова, которых не должно быть в задании",
    stopWords.join(" ")
  );
  localStorage.setItem("keywords", keywords.split(" "));
  localStorage.setItem("stopwords", stopWords.split(" "));
}

settingsBtn.addEventListener("click", setup);
startBtn.addEventListener("click", startWatching);
setSoundBtn.addEventListener("click", setSound);

function setSound(e) {
  if (e.target.innerText === SOUND_ON_TEXT_BTN) {
    setSoundBtn.style.backgroundColor = "";
    setSoundBtn.innerText = SOUND_OFF_TEXT_BTN;
  } else {
    setSoundBtn.style.backgroundColor = "red";
    setSoundBtn.innerText = SOUND_ON_TEXT_BTN;
  }
  soundON = !soundON;
}

let interval;

function startWatching(e = null) {
  if (e && e.target.innerText === STOP_BTN_TEXT) {
    clearInterval(interval);
    startBtn.innerText = START_BTN_TEXT;
    startBtn.style.backgroundColor = "";
    return;
  }
  startBtn.style.backgroundColor = "red";
  startBtn.innerText = STOP_BTN_TEXT;
  interval = setInterval(() => {
    try {
      getMyJobs();
    } catch (error) {
      console.log(error);
    }
  }, 1000 * 60 * DURATION);
}

setTimeout(() => startWatching(), 3000);

// собирает со страницы блоки с заданиями, где есть ключевые слова
function getMyJobs() {
  const jobs = document.querySelectorAll(".new-order-short-description");
  const jobsFull = document.querySelectorAll(".external-links-wrapper");

  const jobsArray = Array.from(jobs);
  let newJobs = 0;
  let myJobs = 0;
  const [keywords, stopWords] = getWords();
  for (let i = 0; i < jobs.length; i++) {
    if (
      jobs[i].style.border !== "3px solid red" &&
      hasKeywords(jobsFull[i].innerText, keywords) &&
      !hasKeywords(jobsFull[i].innerText, stopWords)
    ) {
      jobs[i].style.border = "3px solid red";
      newJobs++;
    } else if (
      jobs[i].style.border == "3px solid red" &&
      !hasKeywords(jobsFull[i].innerText, keywords)
    ) {
      jobs[i].style.border = "";
    }
    if (jobs[i].style.border == "3px solid red") myJobs++;
  }
  titleBlock.innerHTML = `<span style="color:red; font-style:italic;">${myJobs}</span> jobs`;
  if (newJobs) notifyMe(newJobs);
}

function playSound(url) {
  const audio = new Audio(url);
  audio.play();
}

//  прверяет, есть ли в тексте хотя бы одно ключевое слово
function hasKeywords(text, wordsArr) {
  for (let w of wordsArr) {
    if (text.toLowerCase().indexOf(w) !== -1) {
      return true;
    }
  }
  return false;
}

function notifyMe(count) {
  // Проверка поддержки браузером уведомлений
  if (!("Notification" in window)) {
    alert("This browser does not support desktop notification");
  }

  // Проверка разрешения на отправку уведомлений
  else if (Notification.permission === "granted") {
    // Если разрешено, то создаём уведомление
    var notification = new Notification(`Найдено подходящих заданий: ${count}`);
    if (soundON) playSound(soundFile);
  }

  // В противном случае, запрашиваем разрешение
  else if (Notification.permission !== "denied") {
    Notification.requestPermission(function (permission) {
      // Если пользователь разрешил, то создаём уведомление
      if (permission === "granted") {
        var notification = new Notification(
          `Найдено подходящих заданий: ${count}`
        );
        if (soundON) playSound(soundFile);
      }
    });
  }
}
